<?php

namespace app\common\logic;


use app\common\exception\NormalException;
use fast\Ip;
use think\Db;

/**
 * 活码跳转类
 * */
class TickCodeLogic extends BaseLogic
{


    /**
     * 扫描主码
     */
    public function scanCode($code, $source_code_id = '')
    {

        $int_ip = Ip::getRealIp(1);

        // 查询主码信息
        $tick_code_info = \app\common\model\tick\TickCode::with('codeSonRe')
            ->where('code', $code)
            ->find();

        if (empty($source_code_id)) {
            $source_code_id = $code;
        }

        // 如果主码不存在或没有子码，使用默认码继续扫描
        if (empty($tick_code_info) || empty($tick_code_info->codeSonRe)) {
            if ($code !== 'abcd') {
                return $this->scanCode('abcd', $code);
            }
            return null; // 终止递归条件
        }

        // 查找可用的子码
        $code_son = null;
        foreach ($tick_code_info->codeSonRe as $item) {
            if ($item['click_num'] < $item['max_click_num']) {
                $code_son = $item;
                break;
            }
        }

        // 如果不存在可用子码，跳转到二跳地址继续扫描
        if (empty($code_son)) {
            if (isset($tick_code_info->code_jump2) && $tick_code_info->code_jump2 !== $code) {
                return $this->scanCode($tick_code_info->code_jump2, $source_code_id);
            }
            return null; // 终止递归条件
        }

        // 更新子码点击量
        $code_son->click_num++;
        $code_son->save();

        // 插入扫码日志
        $log_insert_data = [
            'code_id' => $tick_code_info->id,
            'user_id' => $tick_code_info->user_id,
            'code_son_id' => $code_son->id,
            'source_code_id' => $source_code_id,
            'ip_int' => $int_ip,
            'ip' => Ip::intToIp($int_ip),
            'create_time' => date('Y-m-d H:i:s'),
        ];

        // 插入日志表
        $res = Db::name('tick_code_log')->insert($log_insert_data);
        if (!$res) {
            addSqlErrorLog('[活码功能]记录扫码日志失败', '', '', json_encode($log_insert_data));
        }

        return $code_son;
    }


}